package meow.async

import meow.Timeline
import meow.Status
import meow.Followers

/** フォロー（お気に入り）を設定する非同期サービス  */
class FollowService {

  boolean transactional = true
  static expose = ['jms']
  static destination = "queue.follow"

  def onMessage = {followers ->
    log.info "----async follow"
    try {
      Status.withCriteria {
        account { eq 'username', followers.target.username }
      }.each {status ->
        // リプライメッセージの回収は，ちょっと気を遣うこと
        // 誰かへの返信か？
        def repliesAddress = status.replies() as Set
        log.info "---- replies(${repliesAddress.isEmpty()}) => ${repliesAddress}"
        if (repliesAddress.contains(followers.owner.username)) {
          // 自分宛ならすでにタイムラインに回収されているからスルー
          log.info "自分宛ならすでにタイムラインに回収されているからスルー"
        }
        else if (!repliesAddress.isEmpty() && Followers.withCriteria {
                 projections { rowCount() }
                 owner { eq 'username', followers.owner.username }
                 // repliesAddressが空([])だとエラーになるんで，ifで弾いている
                 target { 'in' 'username', repliesAddress }
                 }[0] == 0) {
          // 自分以外の場合，自分がフォローしていない相手宛は回収しない
          log.info "自分以外の場合，自分がフォローしていない相手宛は回収しない"
        }
        else {
          // 自分もフォローしている相手へのリプライと返信じゃないつぶやきは回収する
          new Timeline(ownername: followers.owner.username,
                       status: status, statusOwner: followers.target,
                       createDate: status.dateCreated).save()
        }
      }
    }
    catch (e) { e.printStackTrace() }
    log.info "====ASYNC FOLLOW"
  }
}
